package org.wuqiupeng.util;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

public class HttpXmlClient {

	private static final String CORPID = "wxfa6ff1a181c5e943";
	private static final String CORPSCRET = "MHX0dJcsAcOXDHkhmTwl00f7fJ7W4qRJ9Mf7c5wKBC-nJwljbnHGbHyDzICyGp5y";
	private static final String DOMAIN = "http://suirui.com/";
	private static String access_token;
	private static String jsapi_ticket;
	private static String signature;
	private static String timestamp;
	
	public static String getCorpid() {
		return CORPID;
	}
	
	public static String getTimestamp() {
		return timestamp;
	}

	public static void setTimestamp(String timestamp) {
		HttpXmlClient.timestamp = timestamp;
	}

	public static String getNoncestr() {
		return noncestr;
	}

	public static void setNoncestr(String noncestr) {
		HttpXmlClient.noncestr = noncestr;
	}



	private static String noncestr;
	
	public static String getAccess_token() {
		return access_token;
	}

	public static void setAccess_token(String access_token) {
		HttpXmlClient.access_token = access_token;
	}

	public static String getJsapi_ticket() {
		return jsapi_ticket;
	}

	public static void setJsapi_ticket(String jsapi_ticket) {
		HttpXmlClient.jsapi_ticket = jsapi_ticket;
	}

	public static String getSignature() {
		return signature;
	}

	public static void setSignature(String signature) {
		HttpXmlClient.signature = signature;
	}

	public static void getAuthorization(String appname) {
		Map<String, String> params = new HashMap<String, String>();
		params.put("corpid", CORPID);
		params.put("corpsecret", CORPSCRET);
		String xml = HttpXmlClient.post("https://qyapi.weixin.qq.com/cgi-bin/gettoken", params);
		JSONObject jsonMap = JSON.parseObject(xml);
		access_token = (String) jsonMap.get("access_token");
		params.put("access_token", access_token);
		xml = HttpXmlClient.post("https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket", params);
		jsonMap = JSON.parseObject(xml);
		jsapi_ticket = (String) jsonMap.get("ticket");
		noncestr = UUID.randomUUID().toString();
		timestamp = Long.toString(System.currentTimeMillis() / 1000);
		String url = DOMAIN + appname;
		String str = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + noncestr + "&timestamp=" + timestamp + "&url="
				+ url;
		signature = HttpXmlClient.SHA1(str);
		
		System.out.println("xml=" + xml);
		System.out.println("access_token=" + access_token);
        System.out.println("jsapi_ticket=" + jsapi_ticket);
        System.out.println("noncestr=" + noncestr);
        System.out.println("timestamp=" + timestamp);
        System.out.println("signature=" + signature);
        System.out.println("str=" + str);
        System.out.println("url=" + url);
	}

	public static String post(String url, Map<String, String> params) {
		DefaultHttpClient httpclient = new DefaultHttpClient();
		String body = null;
		HttpPost post = postForm(url, params);
		body = invoke(httpclient, post);
		httpclient.getConnectionManager().shutdown();
		return body;
	}

	public static String get(String url) {
		DefaultHttpClient httpclient = new DefaultHttpClient();
		String body = null;
		HttpGet get = new HttpGet(url);
		body = invoke(httpclient, get);
		httpclient.getConnectionManager().shutdown();
		return body;
	}

	private static String invoke(DefaultHttpClient httpclient, HttpUriRequest httpost) {
		HttpResponse response = sendRequest(httpclient, httpost);
		String body = paseResponse(response);
		return body;
	}

	private static String paseResponse(HttpResponse response) {
		HttpEntity entity = response.getEntity();
		String charset = EntityUtils.getContentCharSet(entity);
		String body = null;
		try {
			body = EntityUtils.toString(entity);
		} catch (ParseException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return body;
	}

	private static HttpResponse sendRequest(DefaultHttpClient httpclient, HttpUriRequest httpost) {
		HttpResponse response = null;
		try {
			response = httpclient.execute(httpost);
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return response;
	}

	private static HttpPost postForm(String url, Map<String, String> params) {

		HttpPost httpost = new HttpPost(url);
		List<NameValuePair> nvps = new ArrayList<NameValuePair>();

		Set<String> keySet = params.keySet();
		for (String key : keySet) {
			nvps.add(new BasicNameValuePair(key, params.get(key)));
		}

		try {
			httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}

		return httpost;
	}



	/**
	 * @author���޹�� @date�� 2015��12��17�� ����9:24:43 @description��
	 * SHA��SHA1���� @parameter�� str��������ַ� @return�� ���ܴ�
	 **/
	public static String SHA1(String str) {
		try {
			MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1"); // �����SHA����ֻ��Ҫ��"SHA-1"�ĳ�"SHA"����
			digest.update(str.getBytes());
			byte messageDigest[] = digest.digest();
			// Create Hex String
			StringBuffer hexStr = new StringBuffer();
			// �ֽ�����ת��Ϊ ʮ����� ��
			for (int i = 0; i < messageDigest.length; i++) {
				String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
				if (shaHex.length() < 2) {
					hexStr.append(0);
				}
				hexStr.append(shaHex);
			}
			return hexStr.toString();

		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		return null;
	}
}
